// import qs from 'qs'
import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'
import { ElMessage } from 'element-plus'
import { store } from '@/store'
import { SessionStorageService } from '@/utils/storage'
/* eslint-disable */
import * as Types from '@/store/types'
// const __IS_DEV__ = import.meta.env.DEV

// 可以跨域请求
axios.defaults.withCredentials = true
const service = axios.create({
  headers: {
    'Content-Type': 'application/json'
  },
  // 是否跨站点访问控制请求
  withCredentials: true,
  timeout: 50000,
  // transformRequest: [(data) => {
  //   // 添加公共参数位置
  //   if (shopId) data = { ...data, shopId: shopId }
  //   data = JSON.stringify(data)
  //   return data
  // }],
  validateStatus() {
    return true
  },
  transformResponse: [(data) => {
    if (typeof data === 'string' && data.startsWith('{')) {
      data = JSON.parse(data)
    }
    return data
  }]

})

// 声明一个 Map 用于存储每个请求的标识 和 取消函数
const pending = new Map()
/**
 * 添加请求
 * @param {Object} config
 */
// const addPending = (config: AxiosRequestConfig) => {
//   const url = [
//     config.method,
//     config.url,
//     qs.stringify(config.params),
//     qs.stringify(config.data)
//   ].join('&')
//   config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => {
//     if (!pending.has(url)) { // 如果 pending 中不存在当前请求，则添加进去
//       pending.set(url, cancel)
//     }
//   })
// }
/**
 * 移除请求
 * @param {Object} config
 */
// const removePending = (config: AxiosRequestConfig) => {
//   const url = [
//     config.method,
//     config.url,
//     qs.stringify(config.params),
//     qs.stringify(config.data)
//   ].join('&')
//   if (pending.has(url)) { // 如果在 pending 中存在当前请求标识，需要取消当前请求，并且移除
//     const cancel = pending.get(url)
//     cancel(url)
//     pending.delete(url)
//   }
// }

/**
 * 清空 pending 中的请求（在路由跳转时调用）
 */
export const clearPending = () => {
  for (const [url, cancel] of pending) {
    cancel(url)
  }
  pending.clear()
}

const removeCache = () => {
  SessionStorageService.remove('count')
}

// 请求拦截器
service.interceptors.request.use((config: AxiosRequestConfig) => {
  // removePending(config) // 在请求开始前，对之前的请求做检查取消操作
  // addPending(config) // 将当前请求添加到 pending 中
  const { account: { enterpriseId, departmentId, openId, roleId, accessToken } } = store.state as Record<string, any>
  const { appId } = store.state
  let permissions = `appId=${appId}`
  enterpriseId && (permissions += `;enterpriseId=${enterpriseId}`)
  departmentId && (permissions += `;departmentId=${departmentId}`)
  openId && (permissions += `;openId=${openId}`)
  roleId && (permissions += `;roleId=${roleId}`)
  Object.assign(
    config.headers,
    {
      'edc-uc-flag': 'edc-uc', // 临时方案
      appId: appId,
      enterpriseId: enterpriseId,
      departmentId: departmentId,
      openId: openId,
      Authorization: accessToken ? `Bearer ${accessToken}` : '',
      permissions,
      version: '1.0'
    })
  return config
}, (error) => {
  // 错误抛到业务代码
  error.data = {}
  error.data.msg = '服务器异常，请联系管理员！'
  return Promise.resolve(error)
})

// const ENV = import.meta.env
// 响应拦截器
service.interceptors.response.use((response: AxiosResponse) => {
  // removePending(response)
  const { config: { url } } = response
  const { data } = response
  const errNo = data.code
  console.log("errNo::::",errNo)
  const codeList = [200, '000000']
  console.log(codeList.indexOf(errNo))
  if (codeList.indexOf(errNo) < 0) {
    // 通用的提示：备注, 调用第三方的服务, 比如百度, 可能和我们的接口返回不一致
    if (data?.message && errNo != 401) {
      ElMessage.error(data.message)
      return
    }
    // 检测code是401则清理到登录模块
    console.log("errNo::::",errNo)
    if (errNo === 401 || errNo === 500) {
      console.log("errNo::::",errNo)
      removeCache()
      location.href = '#/login'
      return
    }
  }
  return data
}, (error) => {
  if (axios.isCancel(error)) {
    console.log(`repeated request: ${error.message}`)
  } else {
    error.data = {}
    error.data.msg = '请求超时或服务器异常，请检查网络或联系管理员！'
    ElMessage(error.data.msg)
  }
  return Promise.reject(error)
})
/**
 * 错误码与错误信息的对应关系
 */
const errNoMap = new Map<number, string>()
// 举例
errNoMap.set(100001, '系统错误')

export default service
